Ссылку на Ютуб-канал разрешается делать в блоге. Но вот ссылки на другие сайты запрещены.
Кстати, если вас интересует, на сайте тоже есть свой канал - поэтому возможно договорится о взаиморекламе между каналами.
Это спец фильтр делает (Fanboy's Social Blocking List), его можно отключить.
AdGuard тоже можно включить фильтр, который всё это дело убирает.
Fanboy's Annoyances и Fanboy's Social Blocking List.
PT153, это лимит для одного игрока, то есть героя смогут нанять другие.
Нужно поставить таверне способность Продажа войск. Потом делаешь триггер:
Событие: Юнит вошёл в область (Вся игровая карта)
Условие: Триггеринг юнит равно Герой равно Да (можно этого не делать, просто исключает срабатывание триггера для каждого юнита)
Действия: несколько действий Если/То/Иначе
Если - Юнит тип (Триггеринг юнит) равно Какой-то Герой Из Таверны
То - Нейтральное здание - Удалить Какой-то Герой Из Таверны из таверны
Иначе - Ничего
И так для каждого типа героев в таверне.
Едва ли. Хотя...
Есть хорошее условие wait for condition, благодаря которому всё можно будет впечатать в 1 триггер без особых сложностей.
Например приказать топать в область 1
подождать пока область 1 содержт юнит
приказать что-то ещё.
Оба файла удаляются, потому что ты импортируешь их в карту через программу и не добавляешь данные о файлах в файл импорта(war3map.imp). При сохранении карты в редакторе архив пересобирается, и в него добавляются сторонние файлы, которые сохранены в том самом файле импорта. Поэтому используй стандартный менеджер импорта в редакторе.
pro100master, но ведь это собьет и его текущие приказы?
Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!
Со вторым - можно легко уменьшить хп всех юнитов одной стороны с помощью функции Set Handicap из ГУИ.
Да, я понимаю, но другой вопрос: как "дать редактору понять", что один из игроков отсутствует? Какое событие или же условие надо поставить?
Можно просто считать количество играющих игроков. В ГУИ это делается так: создаешь целочисленную переменную и приравниваешь ее значение к Number of players in (All of players matching (((Matching player) slot status) равно Играет)).
Чтобы это дело прикрутить к установке гандикапа, ты создаешь триггер с кучей событий вида Игрок 1 (красный) leaves the game, туда вставляешь эту штуку выше, и затем там же устанавливаешь гандикап.
Да, и еще, эта функция считает всех компьютерных игроков тоже как "играющих", так что на это надо сделать поправку.
Можешь триггерно давать опыт, для этого в таблице опыта ставишь 0, героев помещаешь в группу, в триггере событие юнит умирает, в условии юнит - враг, в действии в группе героев даёшь опыт.
Экстрасенсы чувствуют что ты шаришь только в GUI, так что замути абилку на основе канала с временем каста 2.33 и нужной анимацией. Она, правда, как-то хреново взаимодействует со станами - не кислотной бомбой (или че-то такое, никогда не сталкивался, пофиг), но послужит тебе верно. При спавне просто кастуй абилку.
Не берите вы эти ульты для основы своих скиллов, они сделаны через одно место лиж бы работали в капмании, а там дальше хоть потоп.
Сделайте заклинание из канала, а юнитов вокруг делайте неуязвимыми.
странно, но в любом случае, я снова дал не ту, эта именно обновляет скин - мороз, оживление, вот это всё пересчитывает. Вот функция смены модели:
function ChangeUnitModelTo takes unit u, string modelpath returns nothing
local integer a
local integer s
set LastConvertedHandle=ConvertHandle(u)
if LastConvertedHandle>0 then
set a=RMem(LastConvertedHandle)+0x88
if a>0 then
set a=RMem(a)
if a>0 then
set s=GetStringAddress(modelpath)
call CallThisCallWith3Args(a,LastConvertedHandle,s,1)
endif
endif
endif
endfunction
Ты так и не присвоил этой переменной нужное значение.
Убедись, что переменная hero_bandit имеет тип Боевая единица.
После создания, сразу используй hero_bandit[0] = (Last created unit)
Бандит надеюсь герой, а не обычный смертный ? (Иначе так ты его не воскресишь)
Прилагаю пример.
Один ресурс - один вопрос. Отвечу на второй.
Событие - Unit - A unit finishes training.
Условие - Unit-type comparison - Unit-type of Trained Units equals ТВОЙ_ТИП
Действия
Unit - Apply a life timer to Trained Unit.
Bergi_Bear, не знаю, я так понимаю, что редактор кампаний как-то по особому позволяет редактировать карту. Насколько помню, изменения карты, что вносятся через редактор кампаний, не влияют на саму карту.
Меняется - можно поставить свой бафф, что сделан на основе оригинальный. Естественно, нельзя сделать так, чтобы отравленные стрелы станили.
Стан только у баша.
Удалить дебафф в момент отлова урона. Его продолжительность не имеет в таком случае никакого значения.
В версии 1.31 можно проверить тип получаемого/наносимого урона. Урон типа NORMAL всегда идет от атаки.
Происходящее здесь напомнило мне один случай из моего далекого прошлого. В те времена я еще только начинал осваивать редактор. Одна из тем, которая меня заинтересовала и по которой мне не удалось найти достаточно полной информации - утечки. Тогда я пошел на один форум и задал простой вопрос о том, как определить наличие и степень серьезности утечек в карте, не перебирая весь код. В результате я получил тонну флуда и "ответ от профи", с которым все в итоге согласились - фрагмент кода с ценным указанием "если это число растет быстро - утечек много, если медленно - мало или нет вовсе". Код представлял из себя таймер с малым периодом, который создавал объект, брал его хендл, писал в чат и удалял объект, но был один нюанс - создаваемый объект утекал на каждой итерации таймера.
я посмотрел короче муй с помощью текста и знаете что он даже не доходит до 100) когда доходит до рандомное число от 1 до 100 примерно(могу ошибаться) он опять становится 2 так что писать таймер[от 1 до 100] вариант)
Если по игроку то массив переменных по игроку, если прям каждого конкретного героя каждого игрока - то через custom value или прочий регистратор юнитов.
Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.
Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
Аналогично ответу на этот вопрос для чистого WE, но без объявления переменных в WE т.к. то уже не так удобно становится когда код во внешнем редакторе.
Теперь о точках входа и инжекте.
Луа позволяет делать такой финт ушами
do
local f = FunctionName -- записываем функцию в переменную
function FunctionName() -- заменяем оригинальную функцию своей
f() -- вызываем оригинальную функцию из переменной
-- здесь могла быть ваша реклама или ваш код
end
end
Это позволит нам сохранить оригинальную функцию в переменную, заменить оригинал своей функцией и вызвать оригинал из переменной. Применимо к любой функции, которая была объявлена раньше, не работает если функция объявлена после выполнения этого кода. Для создания точки входа отлично подходит InitGlobals, она всегда объявляется раньше кастомного кода в WE и вызывается из main.
У себя в коде я пользуюсь немного более сложным способом, этот код не будет работать в WE т.к. цепляет main, а не InitGlobals и не дает серьеных преимуществ перед описаным выше, привожу просто для расширения кругозора
local function InjectMain()
local alpha_main = main
return function()
local alpha_init = RunInitializationTriggers
RunInitializationTriggers = function() end
alpha_main()
InitLibraries() --моя функция, которая должна быть выполнена после всего, но до триггеров инициализации карты
alpha_init()
end
end
main = InjectMain()
Каждую секунду проверяешь изменение золота у каждого игрока и заносишь в переменную. Если золота стало меньше чем указано в переменной, то установи такое количество золота у остальных игроков.
Поскольку не достаточно подробно прописаны условия вопроса - дам альтернативный ответ - поставить всех на паузу. Добыча и строительство гарантированно будут заблокированы. Правда будет заблокировано и все остальное - передвижение, нанесение и получение урона и так далее.
Сделать для каждой способности пассивную копию, где в описании указать необходимое количество золота и при изменении золота, например, изменять способности
Сделать через требование юнита. Юнита назвать, например, "10 золота" и выдавать/убирать их при изменении золота. Выглядеть это будет так:
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.
2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.
Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.
4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.
5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...
Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.
Это легко через Custom Value и переменние.
Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
Кстати да, тоже интересно. Всегда просто удаляю второй. Я понимаю, что там скорее всего что-то несет информационную ценность, но оно бы тогда хотя бы настраивалось как-то в оптимизаторе, создавать его или не создавать и/или удалить после выполнения оптимизации, а то немного раздражает мусор руками чистить. Если такие настройки есть - подскажите плз.
Если хочешь качественную анимацию,где двери шлюза закрываются,то сделай двери гармошкой.
А лучше сделать две модели дверей шлюза.Одни двери открыты,а другие закрыты.И менять их видимости в анимах.
поставить на пузу, либо добавить способность склад, установить скорость бега 0 и заблокировать способности, так же можно просто дамиком кинуть стан в этого юнита и удалять тригерно
Можно создать плейлист, но не гуишными функциями, а написав в кастом скрипте пути к музыке через точку с запятой.
call PlayMusicBJ("war3mapImported\\haruhazazimu9.mp3;war3mapImported\\auaunanodesu.mp3;war3mapImported\\confusingmelody.mp3")
Затем используя getlocalplayer можно используя сравнение расы играть нужный плейлист для каждого.
Заменить декорацию нельзя, но можно сделать иллюзию замены.
1: Ставить декор один на другой и прятать/показывать нужный.
2: Проиграть анимацию, которая есть у модели (можно сделать кастомную модель из нескольких моделей). Если в карте декора мало, то можно для замены использовать "разрушаемые".
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
С патча 1.27 максимальный размер карт для игры по сети - 128 мб.Насчёт платформ: Battle.net не подойдёт?
Hamachi,например.
А вообще большинство платформ такого рода русские.Напр. Playground,iCcup,rubattle.
Есть ещё украинский сервер Алкар.
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
» Администрация XGM / YouTUBE
» WarCraft 3 / Таверна и Герои в ней
» WarCraft 3 / Сохранение приказа
» WarCraft 3 / Золото при переходе на некст карту
» WarCraft 3 / Анимация при создании юнита
» WarCraft 3 / Редактирование приказов
» WarCraft 3 / Создание юнитов
» WarCraft 3 / Вопрос вот в чём...
» WarCraft 3 / таймер
» WarCraft 3 / Константы в jass
» WarCraft 3 / Золото?
» WarCraft 3 / Камера от 3 лица.
» WarCraft 3 / Про погодные условия
» WarCraft 3 / Оптимизация размера карты
» WarCraft 3 / Как устанавливать данную модель?
» WarCraft 3 / Определение расы
» WarCraft 3 / Как сделать прозрачность декорации?
» WarCraft 3 / Warcraft 3 вылетает.
» WarCraft 3 / Редактор моделей
» WarCraft 3 / С чего начать?
» WarCraft 3 / Способность на выбранную область
» WarCraft 3 / Подскажите карты для 1 человека.
» WarCraft 3 / Возможно ли создание собственной карты путей?
» WarCraft 3 / Создание способности триггером
» IrInA Host Bot / проблема с Ирина коннектором